Constructor Access এবং Invocation (getConstructor(), getDeclaredConstructor())

Java Technologies - জাভা রিফ্লেক্ট প্যাকেজ (Java.reflect Package) Constructors এর মাধ্যমে Object Creation |
89
89

java.lang.reflect প্যাকেজের Constructor ক্লাসটি একটি বিশেষ ভূমিকা পালন করে, যা আপনাকে ডাইনামিকভাবে ক্লাসের কনস্ট্রাক্টর অ্যাক্সেস করতে এবং নতুন অবজেক্ট তৈরি করতে সহায়তা করে। রিফ্লেকশন ব্যবহারের মাধ্যমে আপনি এমন কনস্ট্রাক্টর অ্যাক্সেস করতে পারেন যা সাধারনত সাধারণ কোডে অ্যাক্সেস করা সম্ভব নয় (যেমন প্রাইভেট কনস্ট্রাক্টর)। এছাড়া, এটি বিভিন্ন ধরনের কনস্ট্রাক্টরকেও সমর্থন করে, যেমন প্যারামিটারাইজড কনস্ট্রাক্টর।

Constructor Access এবং Invocation:

জাভাতে দুটি প্রধান মেথড রয়েছে, যা কনস্ট্রাক্টর অ্যাক্সেস ও ইনভোকেশন করতে ব্যবহৃত হয়:

  • getConstructor(): পাবলিক কনস্ট্রাক্টর অ্যাক্সেস করার জন্য।
  • getDeclaredConstructor(): ক্লাসের সব কনস্ট্রাক্টর (পাবলিক, প্রাইভেট, প্রটেক্টেড) অ্যাক্সেস করার জন্য।

1. getConstructor():

getConstructor() মেথডটি শুধুমাত্র পাবলিক কনস্ট্রাক্টরগুলি অ্যাক্সেস করতে ব্যবহৃত হয়। এটি নির্দিষ্ট প্যারামিটার টাইপের কনস্ট্রাক্টর ফিরে দেয়। যদি আপনি কোনো প্যারামিটার ছাড়া কনস্ট্রাক্টর চান তবে আপনি এটি ব্যবহার করতে পারেন।

Syntax:

public Constructor<T> getConstructor(Class<?>... parameterTypes)

Return Value: এটি একটি Constructor অবজেক্ট রিটার্ন করে যা নির্দিষ্ট কনস্ট্রাক্টরের ডেটা ধারণ করে।

2. getDeclaredConstructor():

getDeclaredConstructor() মেথডটি ক্লাসের সব কনস্ট্রাক্টর (পাবলিক, প্রাইভেট, প্রটেক্টেড) অ্যাক্সেস করতে ব্যবহৃত হয়। এটি আপনাকে কনস্ট্রাক্টরের অ্যাক্সেস বাড়ানোর জন্য setAccessible(true) মেথডও ব্যবহার করতে পারে, বিশেষ করে যখন কনস্ট্রাক্টর প্রাইভেট বা প্রটেক্টেড হয়।

Syntax:

public Constructor<T> getDeclaredConstructor(Class<?>... parameterTypes)

Return Value: এটি একটি Constructor অবজেক্ট রিটার্ন করে যা আপনার দেওয়া প্যারামিটার টাইপের কনস্ট্রাক্টরকে প্রতিনিধিত্ব করে।

Constructor Invocation:

কনস্ট্রাক্টর ইনভোকেশন করতে newInstance() মেথড ব্যবহার করা হয়। এটি কনস্ট্রাক্টরকে কল করে নতুন অবজেক্ট তৈরি করে।

Syntax:

T newInstance(Object... initargs)

Return Value: এটি নতুন তৈরি করা অবজেক্ট রিটার্ন করে।

প্রতিটি কনস্ট্রাক্টরের কাজ:

  1. getConstructor():
    • পাবলিক কনস্ট্রাক্টরের জন্য।
    • এটি শুধুমাত্র পাবলিক কনস্ট্রাক্টরের জন্য কাজ করে, প্রাইভেট বা অন্য ধরনের কনস্ট্রাক্টরের জন্য উপযুক্ত নয়।
  2. getDeclaredConstructor():
    • সব ধরনের কনস্ট্রাক্টরের জন্য (পাবলিক, প্রাইভেট, প্রটেক্টেড)।
    • এটি সব কনস্ট্রাক্টরের অ্যাক্সেস প্রদান করে এবং প্রাইভেট কনস্ট্রাক্টর অ্যাক্সেস করতে setAccessible(true) ব্যবহৃত হয়।

উদাহরণ কোড:

এখানে একটি উদাহরণ দেওয়া হলো যেখানে getConstructor() এবং getDeclaredConstructor() ব্যবহার করা হয়েছে কনস্ট্রাক্টর অ্যাক্সেস এবং ইনভোকেশন করার জন্য।

import java.lang.reflect.*;

class Person {
    private String name;

    // পাবলিক কনস্ট্রাক্টর
    public Person(String name) {
        this.name = name;
    }

    // প্রাইভেট কনস্ট্রাক্টর
    private Person() {
        this.name = "Unknown";
    }

    public void displayName() {
        System.out.println("Name: " + name);
    }
}

public class ConstructorExample {
    public static void main(String[] args) throws Exception {
        // 1. পাবলিক কনস্ট্রাক্টর ব্যবহার করে অবজেক্ট তৈরি
        Class<?> cls = Person.class;
        Constructor<?> publicConstructor = cls.getConstructor(String.class);
        Person person1 = (Person) publicConstructor.newInstance("John");

        // displayName() মেথড কল
        person1.displayName();

        // 2. প্রাইভেট কনস্ট্রাক্টর ব্যবহার করে অবজেক্ট তৈরি
        Constructor<?> privateConstructor = cls.getDeclaredConstructor();
        privateConstructor.setAccessible(true);  // প্রাইভেট কনস্ট্রাক্টর অ্যাক্সেস করার জন্য
        Person person2 = (Person) privateConstructor.newInstance();

        // displayName() মেথড কল
        person2.displayName();
    }
}

ব্যাখ্যা:

  1. পাবলিক কনস্ট্রাক্টর:
    • cls.getConstructor(String.class) মেথড ব্যবহার করে Person ক্লাসের পাবলিক কনস্ট্রাক্টরটি পাওয়া যায় যা String প্যারামিটার নেয়।
    • এরপর newInstance() মেথডের মাধ্যমে Person অবজেক্ট তৈরি করা হয় এবং তার displayName() মেথড কল করা হয়।
  2. প্রাইভেট কনস্ট্রাক্টর:
    • cls.getDeclaredConstructor() মেথড ব্যবহার করে Person ক্লাসের প্রাইভেট কনস্ট্রাক্টরটি পাওয়া যায়। কারণ এটি প্রাইভেট, তাই setAccessible(true) ব্যবহার করা হয়েছে।
    • এরপর newInstance() মেথড দিয়ে নতুন অবজেক্ট তৈরি করা হয় এবং displayName() মেথড কল করা হয়।

Constructor Access এর সুবিধা:

  1. ডাইনামিক অবজেক্ট তৈরি:
    • কনস্ট্রাক্টর রিফ্লেকশন ব্যবহার করে আপনি রানটাইমে অবজেক্ট তৈরি করতে পারেন, যা সাধারনত সাধারণ কোডে করা সম্ভব নয়।
  2. প্রাইভেট কনস্ট্রাক্টর অ্যাক্সেস:
    • getDeclaredConstructor() মেথড এবং setAccessible(true) ব্যবহার করে আপনি প্রাইভেট কনস্ট্রাক্টরেও অ্যাক্সেস পেতে পারেন।
  3. বিভিন্ন কনস্ট্রাক্টর এক্সেস:
    • একাধিক কনস্ট্রাক্টর থাকলে, আপনি নির্দিষ্ট প্যারামিটার টাইপ দিয়ে কনস্ট্রাক্টরটি নির্বাচন করতে পারেন।

Constructor Access এবং Invocation এর সীমাবদ্ধতা:

  1. পারফরম্যান্স ইস্যু:
    • রিফ্লেকশন অপারেশন সাধারণ কোডের তুলনায় ধীর হতে পারে, কারণ এটি রানটাইমে ক্লাসের সদস্যদের ইনস্পেক্ট করতে হয়।
  2. সিকিউরিটি রিস্ক:
    • প্রাইভেট কনস্ট্রাক্টরের অ্যাক্সেস দেওয়া এবং তাকে পরিবর্তন করার কারণে সিকিউরিটি ঝুঁকি সৃষ্টি হতে পারে।
  3. জটিল কোড:
    • রিফ্লেকশন কোড জটিল হতে পারে এবং কোডে ত্রুটি সনাক্ত করা কঠিন হতে পারে।

getConstructor() এবং getDeclaredConstructor() মেথডগুলো জাভা রিফ্লেকশন প্যাকেজের গুরুত্বপূর্ণ অংশ, যা ডাইনামিকভাবে কনস্ট্রাক্টর অ্যাক্সেস এবং ইনভোকেশন করতে সাহায্য করে। এগুলি বিশেষ করে সেই পরিস্থিতিতে কার্যকর যেখানে আপনি রানটাইমে নতুন অবজেক্ট তৈরি করতে চান এবং আপনি কনস্ট্রাক্টরের প্যারামিটার বা অ্যাক্সেস মডিফায়ার সম্পর্কে পূর্বানুমান করতে পারছেন না। তবে, সেগুলির পারফরম্যান্স এবং সিকিউরিটি বিষয়ক সীমাবদ্ধতাও রয়েছে।

Content added By
Promotion